「今天我們來嘗試寫一下 136. Single Number!」
看到題目的兩個人,開始打開筆電,躍躍欲試的想直接用迴圈處理掉這個題目。
「先別急,我們趁這個機會來講講 bit operation。」夏天說
「咦⋯⋯夏姐那是什麼?我看之前的兩本書,都沒有提到這個觀念?」
「沒關係,我跟你說」菁菁 google 了一番,花了一點時間跟曉欣解釋布林運算的概念。
「可是⋯⋯這些對二進位數字運作的概念,跟這次的題目有什麼關係呢?」曉欣聽完之後,不解地問。
「你看,我們可以發現,如果一個數字同時對某個數字做兩次 xor 運算,那麼就會回到原本的數字」夏天邊說邊在紙上寫著
a xor b xor b = a
「所以,以這題來說,我們只要將陣列內所有的數字 xor 在一起,就會得到落單的數字了」
「這樣寫好神奇喔」兩位一邊感嘆,一邊看著夏天寫下答案
class Solution {
    fun singleNumber(nums: IntArray): Int {
        var ans = 0
        for(element in nums) {
            ans = ans xor element
        }
        return ans
    }
}
看到 Accept 之後,夏天一邊喝著美式,一邊等兩位消化這段邏輯。
「如何?還想得通嗎?」夏天笑笑的看著緊盯螢幕發呆的兩位。
「還⋯⋯還可以吧」曉欣不確定的說。
「那我們再改寫一下」夏天一邊說,一邊調整程式碼
class Solution {
    fun singleNumber(nums: IntArray): Int {
        var ans = 0
        nums.forEach {
            ans = ans xor it
        }
        return ans
    }
}
「還可以這樣寫呀!這邊的 it 太奇妙了吧!」
「原來書上說到的 it 是這樣用的,這樣寫看起來變得好合理」
「如果兩位還可以接受的話,那我再換個寫法囉」看到兩位興奮的表情,夏天又寫了另一種答案
class Solution {
    fun singleNumber(nums: IntArray) 
        = nums.reduce { ans, element -> ans xor element }
}
「哇⋯⋯這」曉欣和菁菁面面相覷。
看到連這樣寫都可以通過,頭腦開始冒煙的兩人,夏天笑得很開心。
「今天先到這邊吧——兩位可以回家再研究看看。」